package myjava.constructors;

public class Root1 {

   public static void main(String[] args) {

      // ### I COSTRUTTORI NON DEVONO AVERE RETURN TYPE! ###
      // ### ALTRIMENTI SONO METODI NORMALI ###
	   
      /* se ogni costruttore richiede almeno 1 par allora non puoi fare
         un'istanza senza passare niente come parametro. java attacca un costruttore
         vuoto alla classe solo se la classe e' senza costruttori.
         solo in quel caso (no explicit constructors) puoi fare affidamento sul
         cotruttore vuoto autogenerato
      */
      
      Son o4 = new Son();
      System.out.println("-------------------------------");
      Son o5 = new Son("hello");
      System.out.println("-------------------------------");
      Son o6 = new Son(1, "yo!");
      System.out.println("-------------------------------");
      Son2 o7 = new Son2();
      System.out.println("-------------------------------");
      Son3 o8 = new Son3();
      System.out.println("-------------------------------");
      Son3 o9 = new Son3("con stringa");
   }
}

class Dad {

   /*
     if a constructor does not explicitly invoke a superclass constructor,
     the JVM automatically inserts a call to the no-argument constructor
     of the superclass. If the super class does not have a no-argument constructor,
     you will get a compile-time error. Object has already such a constructor, so if Object
     is the only superclass there is no problem! */
   public Dad() {
      System.out.println("dad's constructor - no arguments");
   }

   public Dad(String str) {
      System.out.println(str);
   }
}

class Son extends Dad {

   // this needs a no arg in the superclass
   // [!] a no arg constr is automatically inserted
   // in Dad tehre are explicit contr so a no arg is not inserted by the JVM!!!
   public Son() {
      System.out.println("son's constructor - no arguments");
   }

   public Son(String str) {
      System.out.println(str);
   }

   public Son(int num, String str) {
      super(str);
      System.out.println(num);
   }
}

class Son2 extends Dad {
   /* il costruttore vuoto di default viene inserito solo se non ci sono
    costruttori espliciti gia dichiarati, siano essi no-arg constructors or
    con argomenti */
}

class Son3 extends Dad {

   public Son3() {
      this("call to another constructor");
      System.out.println("son3's constructor - no arguments");
   }

   public Son3(String s) {
      super("hi dad");
      System.out.println(s);
   }
}

class Son4 extends Son2 {

   public Son4() {
      super(); // useless!
   }
}